﻿#include "StyleManager.h"
#include "CustomGraphicsScene.h"
#include <QVBoxLayout>
#include <QDialogButtonBox>
#include <QLabel>
#include <QgsCategorizedSymbolRenderer.h>
#include <QgsStyle.h>
#include <QgsSymbol.h>
#include <QgsVectorLayer.h>
#include <QgsApplication.h>
#include <QMessageBox>
#include <QgsStyleManagerDialog.h>
#include <QToolBar>

// 绘图相关
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPushButton>
#include <QFileDialog>
#include <qsvggenerator.h>
#include <QPainter>
#include <qgssymbol.h>
#include <qgssymbollayer.h>
#include <qgsmarkersymbollayer.h>
#include <QInputDialog>
#include <QBuffer>

// 包含 QGIS 渲染器相关的头文件
#include <qgsrenderer.h>
#include <qgssinglesymbolrenderer.h>
#include <qgscategorizedsymbolrenderer.h>
#include <qgsgraduatedsymbolrenderer.h>

// 包含 QGIS 渲染器小部件
#include <qgssinglesymbolrendererwidget.h>
#include <qgscategorizedsymbolrendererwidget.h>
#include <qgsgraduatedsymbolrendererwidget.h>

StyleManager::StyleManager(QObject* parent) : QObject(parent) {}

void StyleManager::openStyleManager(QgsMapLayer* layer)
{
	if (!layer)
	{
		QMessageBox::warning(nullptr, tr("错误"), tr("无效的图层。"));
		return;
	}

	// 如果是矢量图层，打开样式管理器对话框
	QgsVectorLayer* vectorLayer = qobject_cast<QgsVectorLayer*>(layer);
	if (vectorLayer)
	{
		// 打开自定义的样式管理器对话框
		QDialog* dialog = createStyleDialog(vectorLayer);
		dialog->exec(); // 显示对话框并等待用户操作
	}
	else
	{
		QMessageBox::warning(nullptr, tr("错误"), tr("样式管理器只支持矢量图层。"));
	}
}

QDialog* StyleManager::createStyleDialog(QgsVectorLayer* layer)
{
	QDialog* dialog = new QDialog();
	dialog->setWindowTitle(tr("样式管理器 - %1").arg(layer->name()));
	dialog->resize(800, 1000);

	QVBoxLayout* layout = new QVBoxLayout(dialog);

	// 加载系统符号库
	QgsStyle* style = QgsStyle::defaultStyle();
	style->importXml("./symbols/default.xml");

	// 创建符号库选择器
	QLabel* label = new QLabel(tr("符号库选择："), dialog);
	layout->addWidget(label);

	// 创建一个占位控件，用于显示不同的渲染器小部件
	QWidget* rendererWidgetContainer = new QWidget(dialog);
	QVBoxLayout* rendererLayout = new QVBoxLayout(rendererWidgetContainer);
	layout->addWidget(rendererWidgetContainer);

	// 保存原始的渲染器状态，以便在用户点击 "Cancel" 时可以恢复
	QgsFeatureRenderer* originalRenderer = layer->renderer()->clone();

	QgsFeatureRenderer* renderer = layer->renderer();
	QgsRendererWidget* rendererWidget = nullptr;

	// 根据用户选择的模式，动态创建渲染器小部件
	auto updateRendererWidget = [=, &rendererWidget]() mutable {
		// 如果有旧的渲染器小部件，移除并删除它
		if (rendererWidget)
		{
			rendererLayout->removeWidget(rendererWidget);
			rendererWidget->deleteLater();
			delete rendererWidget;
		}

		// 创建新的渲染器小部件
		QgsRendererWidget* newRendererWidget = nullptr;

		// 单一符号化渲染
		if (dynamic_cast<QgsSingleSymbolRenderer*>(renderer))
		{
			newRendererWidget = new QgsSingleSymbolRendererWidget(layer, style, dynamic_cast<QgsSingleSymbolRenderer*>(renderer));
		}
		else
		{
			newRendererWidget = new QgsSingleSymbolRendererWidget(layer, style, new QgsSingleSymbolRenderer(QgsSymbol::defaultSymbol(layer->geometryType())));
		}

		// 将新的渲染器小部件赋值给 rendererWidget
		rendererWidget = newRendererWidget;

		// 添加新的渲染器小部件到布局
		if (rendererWidget)
		{
			rendererLayout->addWidget(rendererWidget);
		}
		};

	// 初始化时加载当前渲染器小部件
	updateRendererWidget();

	// 确认、取消和应用按钮
	QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Apply, dialog);
	layout->addWidget(buttonBox);

	// 连接“应用”按钮的信号，确保应用当前的符号化设置，但不关闭对话框
	connect(buttonBox->button(QDialogButtonBox::Apply), &QPushButton::clicked, dialog, [=]() {
		// 检查渲染器是否为空
		if (!rendererWidget || !rendererWidget->renderer()) {
			QMessageBox::warning(dialog, tr("错误"), tr("无法获取渲染器。"));
			return;
		}

		// 设置渲染器并刷新地图
		layer->setRenderer(rendererWidget->renderer());
		layer->triggerRepaint();  // 触发重新绘制

		});

	// 连接“确定”按钮的信号，应用符号化设置并关闭对话框
	connect(buttonBox->button(QDialogButtonBox::Ok), &QPushButton::clicked, dialog, [=]() {
		// 检查渲染器是否为空
		if (!rendererWidget || !rendererWidget->renderer()) {
			QMessageBox::warning(dialog, tr("错误"), tr("无法获取渲染器。"));
			return;
		}

		// 设置渲染器并刷新地图
		layer->setRenderer(rendererWidget->renderer());
		layer->triggerRepaint();  // 触发重新绘制
		dialog->accept();  // 关闭对话框

		// 删除原始渲染器对象
		delete originalRenderer;
		});

	// 连接“取消”按钮的信号，恢复原始的渲染器状态并关闭对话框
	connect(buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, dialog, [=]() {
		// 恢复原始的渲染器
		layer->setRenderer(originalRenderer);
		layer->triggerRepaint();  // 触发重新绘制

		dialog->reject();  // 关闭对话框
		});

	return dialog;
}